package com.geek.javase.ch13.work;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/*
1.文本排序
请将以下文本信息恢复顺序。
三.侍中、侍郎郭攸之、费祎、董允等，此皆良实，志虑忠纯，是以先帝简拔以遗陛下。愚以为宫中之事，事无大小，悉以咨之，然后施行，必得裨补阙漏，有所广益。
八.愿陛下托臣以讨贼兴复之效，不效，则治臣之罪，以告先帝之灵。若无兴德之言，则责攸之、祎、允等之慢，以彰其咎；陛下亦宜自谋，以咨诹善道，察纳雅言，深追先帝遗诏，臣不胜受恩感激。
四.将军向宠，性行淑均，晓畅军事，试用之于昔日，先帝称之曰能，是以众议举宠为督。愚以为营中之事，悉以咨之，必能使行阵和睦，优劣得所。
二.宫中府中，俱为一体，陟罚臧否，不宜异同。若有作奸犯科及为忠善者，宜付有司论其刑赏，以昭陛下平明之理，不宜偏私，使内外异法也。
一.先帝创业未半而中道崩殂，今天下三分，益州疲弊，此诚危急存亡之秋也。然侍卫之臣不懈于内，忠志之士忘身于外者，盖追先帝之殊遇，欲报之于陛下也。诚宜开张圣听，以光先帝遗德，恢弘志士之气，不宜妄自菲薄，引喻失义，以塞忠谏之路也。
九.今当远离，临表涕零，不知所言。
六.臣本布衣，躬耕于南阳，苟全性命于乱世，不求闻达于诸侯。先帝不以臣卑鄙，猥自枉屈，三顾臣于草庐之中，咨臣以当世之事，由是感激，遂许先帝以驱驰。后值倾覆，受任于败军之际，奉命于危难之间，尔来二十有一年矣。
七.先帝知臣谨慎，故临崩寄臣以大事也。受命以来，夙夜忧叹，恐付托不效，以伤先帝之明，故五月渡泸，深入不毛。今南方已定，兵甲已足，当奖率三军，北定中原，庶竭驽钝，攘除奸凶，兴复汉室，还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益，进尽忠言，则攸之、祎、允之任也。
五.亲贤臣，远小人，此先汉所以兴隆也；亲小人，远贤臣，此后汉所以倾颓也。先帝在时，每与臣论此事，未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军，此悉贞良死节之臣，愿陛下亲之信之，则汉室之隆，可计日而待也。
 */
import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.*;

public class Demo1 {

    public static void main(String[] args) {
        String inputFile = "text.txt";  // 输入文件名
        String outputFile = "sortedtext.txt";  // 输出文件名

        try {
            // 1. 从文件读取文本信息
            List<String> lines = readTextFromFile(inputFile);
            // 2. 解析文本信息到集合中
            List<TextParagraph> paragraphs = parseText(lines);
            // 3. 对集合进行排序
            Collections.sort(paragraphs);
            // 4. 遍历集合并输出到文件
            writeSortedTextToFile(paragraphs, outputFile);
            // 5. 同时在控制台显示结果
            displaySortedText(paragraphs);

            System.out.println("排序完成！结果保存到: " + outputFile);

        } catch (IOException e) {
            System.err.println("文件操作错误: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("处理过程中发生错误: " + e.getMessage());
        }
    }

    //从文件读取文本信息
    private static List<String> readTextFromFile(String filename) throws IOException {
        return Files.readAllLines(Paths.get(filename));
    }

    //解析文本信息到集合中
    private static List<TextParagraph> parseText(List<String> lines) {
        List<TextParagraph> paragraphs = new ArrayList<>();

        // 中文数字到阿拉伯数字的映射
        Map<String, Integer> numberMap = createNumberMap();

        for (String line : lines) {
            if (line.trim().isEmpty()) continue;  // 跳过空行

            // 解析每行文本，提取序号和内容
            int dotIndex = line.indexOf('.');
            if (dotIndex > 0) {
                String numberStr = line.substring(0, dotIndex).trim();
                String content = line.substring(dotIndex + 1).trim();

                Integer order = numberMap.get(numberStr);
                if (order != null) {
                    paragraphs.add(new TextParagraph(order, numberStr, content));
                } else {
                    System.err.println("无法识别的序号: " + numberStr);
                }
            }
        }

        return paragraphs;
    }

    //创建中文数字映射表
    private static Map<String, Integer> createNumberMap() {
        Map<String, Integer> map = new HashMap<>();
        map.put("一", 1);
        map.put("二", 2);
        map.put("三", 3);
        map.put("四", 4);
        map.put("五", 5);
        map.put("六", 6);
        map.put("七", 7);
        map.put("八", 8);
        map.put("九", 9);
        map.put("十", 10);
        return map;
    }

    //将排序后的文本写入文件
    private static void writeSortedTextToFile(List<TextParagraph> paragraphs, String filename) throws IOException {
        try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(Paths.get(filename)))) {
            for (TextParagraph paragraph : paragraphs) {
                writer.println(paragraph.getOriginalNumber() + "." + paragraph.getContent());
            }
        }
    }

    //在控制台显示排序后的文本
    private static void displaySortedText(List<TextParagraph> paragraphs) {
        System.out.println("=== 排序后的文本 ===");
        for (TextParagraph paragraph : paragraphs) {
            System.out.println(paragraph.getOriginalNumber() + "." + paragraph.getContent());
        }
        System.out.println("=======================");
    }
}

//文本段落类，实现Comparable接口用于排序
class TextParagraph implements Comparable<TextParagraph> {
    private final int order;
    private final String originalNumber;
    private final String content;

    public TextParagraph(int order, String originalNumber, String content) {
        this.order = order;
        this.originalNumber = originalNumber;
        this.content = content;
    }
    //元素自身实现比较逻辑
    @Override
    public int compareTo(TextParagraph other) {
        return Integer.compare(this.order, other.order);
    }

    public int getOrder() {
        return order;
    }

    public String getOriginalNumber() {
        return originalNumber;
    }

    public String getContent() {
        return content;
    }

    @Override
    public String toString() {
        return originalNumber + "." + content;
    }
}